type User = {
  id: number,
  name: string,
  age: number
}

// 小技巧，通过& {} 可以看到keyof组成的联合类型
type UserKeys = keyof User & {}

let a: UserKeys = "id";

const person = {
  name: "jack",
  sex: "男",
  age: 20
}

// 可以和typeof联合使用，获取一个对象的键的联合类型
type PersonKeys = keyof typeof person

// 可以和方括号运算符联合使用，获取对象类型值的类型

type Person = {
  name: string;
  sex: boolean;
  age: number;
}

type ValueType = Person[keyof Person];

// 之前重载实现的createElement

// function createElement(tagName: 'a'): HTMLAnchorElement
// function createElement(tagName: 'div'): HTMLDivElement
// function createElement(tagName:string):HTMLElement { 
//   return document.createElement(tagName)
// }

type TagName = keyof HTMLElementTagNameMap & {};

function createElement<T extends TagName>(tagName:T):HTMLElementTagNameMap[T] { 
  return document.createElement(tagName)
}

const div = createElement("div")
